package cn.blnp.net.flowable.listen.global.events;

import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.event.*;
import org.flowable.engine.delegate.event.FlowableProcessStartedEvent;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;

/**
 * <h3>全局监听器事件的实现</h3>
 *
 * @author <a href="mailto:blnp.yibin@qq.com">lyb</a>
 * @version 1.0
 * @since 2025/5/21 16:42
 */
@Slf4j
public class GlobalEventListenerImpl implements FlowableEventListener {
    @Override
    public void onEvent(FlowableEvent event) {
        FlowableEventType eventType = event.getType();
        if (FlowableEngineEventType.PROCESS_STARTED.equals(eventType)){
            FlowableEntityEvent eventInfo = (FlowableEntityEvent) event;
            ExecutionEntity execEntity = (ExecutionEntity)((FlowableEntityEvent) event).getEntity();
            log.info("流程启动，" + "processInstanceId：" + execEntity.getProcessInstanceId() + "，eventType：" + eventType);
        }else if (FlowableEngineEventType.PROCESS_COMPLETED.equals(eventType)){
            FlowableEngineEntityEvent eventInfo = (FlowableEngineEntityEvent) event;
            log.info("流程结束，" + "processInstanceId：" + eventInfo.getProcessInstanceId() + "，eventType：" + eventType);
        }
        log.info("eventName:" + event.getType().name());
    }

    @Override
    public boolean isFailOnException() {
        /**
         *  决定了当事件触发，监听器执行onEvent()方法抛出异常时的后续处理动作：如果返回结果为false，表示忽略onEvent()方法中抛出的异常；如果返回结果为true，
         *  则表示onEvent()方法中抛出的异常继续向上传播。
         **/
        return false;
    }

    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        /**
         *  用来确定onEvent()方法是立即执行还是由getOnTransaction()方法指定的事务生命周期事件触发时执行。如果isFireOnTransactionLifecycleEvent()方法返回结果
         *  为false，表示onEvent()方法将立即执行；如果返回结果为true，表示onEvent()方法将在由getOnTransaction()方法指定的事务生命周期事件触发时执行。getOnTransaction()方法
         *  返回一个字符串，其结果可配置如下。
         * （1）COMMITTING：表示事务正在提交，即事务已经执行完所有的操作，但还未完成提交的状态。
         * （2）COMMITTED：表示事务已经成功提交，即事务执行的所有操作已经永久保存到数据库的状态。
         * （3）ROLLINGBACK：表示事务正在回滚，即事务发生了错误正在撤销之前执行的状态。
         * （4）ROLLED_BACK：表示事务已经回滚完成，即事务的所有操作都已经被撤销，数据库恢复到事务开始之前的状态。
         **/
        return false;
    }

    @Override
    public String getOnTransaction() {
        //返回值，见方法：isFireOnTransactionLifecycleEvent
        return null;
    }
}
